// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "../SQLObjectImpl.h"
#include "../SQLStatementImpl.h"

class SQLMergeStatement_MergeUpdateClause : public SQLObjectImpl
{
public:
  SQLUpdateSetItem_list_ptr items;
  SQLExpr_ptr where;
  SQLExpr_ptr deleteWhere;
  BOOL_ptr delete_;

  SQLMergeStatement_MergeUpdateClause();
  SHAREDOBJECT(SQLMergeStatement_MergeUpdateClause);

  SQLUpdateSetItem_list_ptr getItems();

  void addItem(SQLUpdateSetItem_ptr item);

  BOOL_ptr isDelete();

  void setDelete(BOOL_ptr delete_);

  SQLExpr_ptr getWhere();

  void setWhere(SQLExpr_ptr where);

  SQLExpr_ptr getDeleteWhere();

  void setDeleteWhere(SQLExpr_ptr x);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);
};

class SQLMergeStatement_MergeInsertClause : public SQLObjectImpl
{
public:
  SQLExpr_list_ptr columns;
  SQLExpr_list_ptr values;
  SQLExpr_ptr where;

  SQLMergeStatement_MergeInsertClause();
  SHAREDOBJECT(SQLMergeStatement_MergeInsertClause);
  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  SQLExpr_list_ptr getColumns();

  void setColumns(SQLExpr_list_ptr columns);

  SQLExpr_list_ptr getValues();

  void setValues(SQLExpr_list_ptr values);

  SQLExpr_ptr getWhere();

  void setWhere(SQLExpr_ptr x);
};

class SQLMergeStatement : public SQLStatementImpl
{
public:
  SQLHint_list_ptr hints;

  SQLTableSource_ptr into;
  string_ptr alias;
  SQLTableSource_ptr using_;
  SQLExpr_ptr on;
  SQLMergeStatement_MergeUpdateClause_ptr updateClause;
  SQLMergeStatement_MergeInsertClause_ptr insertClause;
  SQLErrorLoggingClause_ptr errorLoggingClause;

SQLMergeStatement();
  SHAREDOBJECT(SQLMergeStatement);

  void accept0(SQLASTVisitor_ptr visitor);

  string_ptr getAlias();

  SQLTableSource_ptr getInto();

  void setInto(SQLName_ptr into);

  void setInto(SQLTableSource_ptr into);

  SQLTableSource_ptr getUsing();

  void setUsing(SQLTableSource_ptr using_);

  SQLExpr_ptr getOn();

  void setOn(SQLExpr_ptr on);

  SQLMergeStatement_MergeUpdateClause_ptr getUpdateClause();

  void setUpdateClause(SQLMergeStatement_MergeUpdateClause_ptr updateClause);

  SQLMergeStatement_MergeInsertClause_ptr getInsertClause();

  void setInsertClause(SQLMergeStatement_MergeInsertClause_ptr insertClause);

  SQLErrorLoggingClause_ptr getErrorLoggingClause();

  void setErrorLoggingClause(SQLErrorLoggingClause_ptr errorLoggingClause);

  SQLHint_list_ptr getHints();
};
